#ifndef __BSP_PID_CONTROLLER_H
#define __BSP_PID_CONTROLLER_H

#include <stdbool.h>

// ==================== 调试时需要修改的参数区域 ====================
// 在这里修改PID参数进行调试
#define DEFAULT_PID_KP     1.0f    // 比例系数 - 主要调节响应速度
#define DEFAULT_PID_KI     0.1f    // 积分系数 - 主要消除静差
#define DEFAULT_PID_KD     0.05f   // 微分系数 - 主要抑制超调

#define DEFAULT_PID_MAX_OUTPUT  10000.0f  // 最大输出限制
#define DEFAULT_PID_MAX_INTEGRAL 5000.0f  // 积分限幅
// ==============================================================

// PID模式
typedef enum {
    PID_MODE_POSITION = 0,  // 位置式PID
    PID_MODE_VELOCITY = 1   // 增量式PID
} pid_mode_t;

// PID控制器结构体
typedef struct {
    // ========== 调试参数 ==========
    float kp;               // 比例系数
    float ki;               // 积分系数  
    float kd;               // 微分系数
    
    // ========== 限幅参数 ==========
    float output_limit;     // 输出限幅
    float integral_limit;   // 积分限幅
    
    // ========== 运行数据 ==========
    float integral;         // 积分项
    float prev_error;       // 上一次误差
    float prev_output;      // 上一次输出（增量式用）
    float prev_measurement; // 上一次测量值（微分用）
    
    // ========== 配置参数 ==========
    pid_mode_t mode;        // PID模式
    float dt;               // 控制周期(秒)
    bool enable;            // 使能标志
    
    // ========== 调试信息 ==========
    float last_output;      // 最后输出值
    float last_error;       // 最后误差值
    uint32_t update_count;  // 更新计数
} pid_controller_t;

// 函数声明
void pid_init(pid_controller_t *pid, pid_mode_t mode, float dt);
void pid_set_parameters(pid_controller_t *pid, float kp, float ki, float kd);
void pid_set_limits(pid_controller_t *pid, float output_limit, float integral_limit);
void pid_reset(pid_controller_t *pid);

float pid_calculate(pid_controller_t *pid, float target, float measurement);
float pid_calculate_position(pid_controller_t *pid, float target, float measurement);
float pid_calculate_velocity(pid_controller_t *pid, float target, float measurement);

// 调试信息获取
float pid_get_last_output(pid_controller_t *pid);
float pid_get_last_error(pid_controller_t *pid);
void pid_get_debug_info(pid_controller_t *pid, float *p_term, float *i_term, float *d_term);

#endif